<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>高阶函数_函数柯里化</title>
</head>
<body>
  <!-- 准备一个容器 -->
  <div id="test"></div>

  <!-- 导入react包 -->
  <script type="text/javascript" src="../js/react.development.js"></script>
  <script type="text/javascript" src="../js/react-dom.development.js"></script>
  <script type="text/javascript" src="../js/babel.min.js"></script>

  <script type="text/babel">
    /*
      高阶函数:如果一个函数符合下面2个规范中的任何一个，那该函数就是高阶函数。
        1.若A函数，接收的参数是一个函数，那么A就可以称之为高阶函数。
        2.若A函数，调用的返回值依然是一个函数，那么A就可以称之为高阶函数。
      函数的柯里化: 通过函数调用继续返回函数的方式，实现多次接收参数最后统一处理的函数编码形式。
    */

    // 创建组件
    class Login extends React.Component{
      // 初始化状态
      state = {
        username: '',  // 用户名
        password: '',  // 密码
      }

      // 保存表单数据到状态中
      saveFormData = (dataType)=>{
        return (event)=>{
          this.setState({[dataType]:event.target.value})
        }
      }

      // 表单提交
      fromDataSubmit = ()=>{
        event.preventDefault()  // 取消点击按钮后的跳转动作
        const {username, password} = this.state
        alert(`用户名: ${this.username.current}, 密码: ${this.password.current}`)
      }

      render(){
        return(
          <div>
            <form onSubmit={this.fromDataSubmit}>
              UserName: <input onChange={this.saveFormData('username')} type="text" name="username" /><br/>
              PassWord: <input onChange={this.saveFormData('password')} type="password"  name="password"/><br/>
              <button>Login</button>
            </form>
          </div>
        )
      }
    }

    // 渲染组件到页面
    ReactDOM.render(<Login/>, document.getElementById('test'))
  </script>

</body>

</html>